//一个数组，里面的元素排列呈现先增大后减小的规律，请找出其中最大元素的下标
//如果是先减小后增大也是一样的思路
//二分法

public class upAndDown {

    public static void main(String[] args) {
        int[] arr = new int[]{1,3,4,7,2};
        int res = findPeak(arr);
        System.out.println(res);
    }

    static int findPeak(int[] nums){
        if (nums != null && nums.length > 0) {
            if (nums.length == 1) {
                return 0;
            }
            if (nums[0] > nums[1]) {//数组单调递减
                return 0;
            }
            int index = nums.length-1;
            if (nums[index] > nums[index-1]) {//数组单调递增
                return index;
            }
            int i = 0, j = index;
            int mid = 0;
            while (i < j) {//二分查找
                mid = (i + j) / 2;
                //大于左边且大于右边，山顶，符合要求
                if (nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]) {
                    return mid;
                } else if (nums[mid] > nums[mid + 1]) {//仅大于右边，处于下坡段, 即递减段
                    j = mid - 1;//区间左移
                } else if (nums[mid] > nums[mid - 1]) {//仅大于左边，处于上坡段, 即递增段
                    i = mid + 1;//区间右移
                }
            }
        }
        return -1;
    }
}
